package org.huangrui.spark.scala.core.rdd.serial

import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Author hr
 * @Create 2024-10-18 12:12 
 */
object Spark01_RDD_Serial {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf().setMaster("local[*]").setAppName("spark")
    val sc = new SparkContext(conf)
    val rdd = sc.makeRDD(List(1, 2, 3, 4), 2)


    // TODO 对象是在Driver端创建的
    val s = new Student()
    // [1,2][3,4]
    // foreach算子是分布式循环：分区内有序，分区间无序
    // TODO
    //    SparkException: Task not serializable
    //    java.io.NotSerializableException: org.huangrui.spark.java.core.rdd.serial.Student


    // RDD算子中传递的函数是会包含闭包操作，那么就会进行检测功能
    // 闭包检测：闭包检测是Driver端进行的，所以传递给Executor端的函数中使用的对象必须实现可序列化接口
    rdd.foreach((x: Int) => {
      // TODO 在Executor端循环遍历的时候使用到了Driver端对象
      //      运行过程中，就需要将Driver端的对象通过网络传递到Executor端，否则无法使用
      //      这里传输的对象必须要实现可序列化接口，否则无法传递。
      println(s.age + x)
    })

    sc.stop()
  }

  // 样例类在编译时，会自动混入序列化特质（实现可序列化接口）
  // case class Student(age: Int = 10)
  // class Student extends Serializable {
  class Student {
    var age: Int = 10
  }
}
